#pragma once
#define ElemType int
#define MyExit 9999

//have head
typedef struct LNode {
    ElemType data;
    struct LNode* next;
}LNode, * LinkList;

//InitList
bool InitList(LinkList& L);

//get Length
int GetLength(LinkList L);

//GetElem
LNode* GetElem(LinkList L, int i);

// LocateElem
LNode* LocateElem(LinkList L, ElemType e);

// Base Insert
bool BaseInsert(LNode* p, ElemType e);

//
bool ListInsert(LinkList& L, int i, ElemType e);

//Another front Insert
bool ListFrontInsert(LinkList& L, int i, ElemType e);

//Delete Node
bool ListDelete(LinkList& L, int i, ElemType& e);

// Head Insert
bool List_HeadInsert(LinkList& L);

// Tail Insert
bool List_TailInsert(LinkList& L);

// Circlate LinkList

bool InitCLinkList(LinkList& L);

//Double LinkList

typedef struct DLNode {
    ElemType data;
    DLNode* next, * prior;
}DLNode, * DLinkList, * CDLinkList;

//Init
bool InitDLinkList(DLinkList& L);

// DList_HeadInsert
bool DList_HeadInsert(DLinkList& L);

// CDList_TailInsert
bool CDList_TailInsert(CDLinkList& L);

bool InitCDLinkList(CDLinkList& L);

// Find front DLNode
DLNode* FindFrontDLNode(DLinkList& L, int i);

DLNode* FindFrontCDLNode(CDLinkList& L, int i);

bool BehindInsertDLNode(DLNode* p, ElemType e);

bool BehindInsertCDLNode(DLNode* p, ElemType e);

// insert
bool DLinkListInsert(DLinkList& L, int i, ElemType e);

// Delete DLNode
bool DLinkLListDelete(DLinkList& L, int i, ElemType& e);

#define MaxSize 50
typedef struct {
    ElemType data;
    int next;
}SLinkList[MaxSize];

